/****************************************************************************************** Import */
import _ from 'lodash';
import {AsyncStorage} from 'react-native';

/****************************************************************************************** Class */
export default class Storage {

    /************************************************************************************** 外部调用接口 */
    /**
     * 获取一个Storage条目
     * 
     * @param {String} key 键名
     * @param {Function} success 回调方法
     */
    static get(key, success) {

        // 验证key参数
        if (!_.isString(key) || key == '') console.error('Storage.get方法中的key参数必须为String类型，且不能为空字符串！');

        // 取数据
        AsyncStorage.getItem(key, (err, res)=> {

            // 如果出错，则收集错误
            if (err) {
                this._collecFail(err, key);
                console.error(err);
                return;
            }

            // 声明result，并查看是否返回了null或undefined（null或undefined为无值），如果不是则将result = res
            let result = null;
            if (!_.isNil(res)) {
                result = res;
            }

            // 调用回调。注意：JSON.parse。注意：不允许存储html
            if (_.isFunction(success)) {
                success(JSON.parse(result));
            }
        });
    }

    /** 
     * 设置一个Storage条目
     * 
     * @param {String} key 键名
     * @param {Any} value 值
     * @param {Function} success 回调方法
     */
    static set(key, value, success) {

        // 验证key参数和value
        if (!_.isString(key) || key == '') console.error('Storage.set方法中的key参数必须为String类型，且不能为空字符串！');
        if (_.isUndefined(value)) console.error('Stroage.set方法中的value参数不能是undefined！');

        // 返回promise
        AsyncStorage.setItem(key, JSON.stringify(value), (err)=> {

            // 如果出错，则收集错误
            if (err) {
                this._collecFail(err, key, value);
                console.error(err);
                return;
            }

            // 调用回调
            if (_.isFunction(success)) {
                success();
            }
        });
    }

    /************************************************************************************** 错误收集方法 */
    /**
     * 收集错误
     * 注意：一但storage出现错误，则直接上传到服务器的错误收集接口
     * 
     * @param {Any} err 错误信息
     * @param {Object} obj 原始设置对象
     */
    static _collecFail(err, key, value) {
        // console.log(res);
    }
}
